package com.l.Thread.Callable;

import java.util.concurrent.*;

/**
 *
 * Callable<v>
 * 和Runnable相同，相对来说增加了泛型返回值，可以声明异常
 * Thread 的构造方法中并没有定义接收Callable参数，所以需要使用线程池进行启动
 *
 *
 * Future<T>用来接收submit()所返回的状态结果
 * Future<T>中的get()以阻塞形式等待Future中的异步处理结果，等待call()方法执行完成以后在进行打印返回值
 *
 * @author Mc.Chai
 * @program: Java基础
 * @create 2021-11-15-20:53 20:53
 */
public class TestCallable {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService= Executors.newFixedThreadPool(3);
        Callable<Integer> task=new MyTask();
        Future<Integer> future=executorService.submit(task);    //submit生成一个Future对象和提交任务
        Integer integer=future.get();       //调用Future的get()得到返回值
        System.out.println(integer);

    }
}
class MyTask implements Callable<Integer>{
    Integer sum=0;
    @Override
    public Integer call() throws Exception {
        for (int i = 0; i <= 100; i++) {
            System.out.println(Thread.currentThread().getName()+" : "+i);
            Thread.sleep(100);  //不需要try--catch
            sum+=i;
        }
        return sum;
    }
}
